package services;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import entitybeans.Articulo;
import entitybeans.CentroDistribucion;
import entitybeans.Tienda;
import org.apache.commons.lang.StringUtils;
@Stateless
public class ServicesAdministratorBean implements ServicesAdministrator{

    /**
     * FLAGS to enabled/disable ws by modules.
     */
    private static final boolean FABRICA_ENABLED = true;

    private static final boolean TIENDA_ENABLED = true;

    private static final boolean CENTRO_DISTRIBUCION_ENABLED = true;
    
    @EJB
    private ClienteJMS JMSClient;
    
    @EJB
    private SOAPAdministrator soapAdmin;   


	@Override
	public void enviarOfadJMS(String xml, List<Tienda> tiendas) {
	   if (TIENDA_ENABLED) { 
               for (Tienda t : tiendas) {
                       if (StringUtils.isNotEmpty(t.getJmsConnectionString()) 
                                       && StringUtils.isNotEmpty(t.getQueueName())) { 
                       //if (t.getJmsConnectionString()!= null && t.getQueueName()!=null) {
                               new Thread(new EnviarOfadATienda(xml, t)).start();
                               //JMSClient.enviarOfad(xml, t);
                       }
               }
       }
	}

	@Override
	public void enviarSolDistWS(Hashtable <String, CentroDistribucion> solicitudesXMLyCentros) {
		System.out.println("ENTRE AL enviarSolDistWS de Services Administrator");
		if (CENTRO_DISTRIBUCION_ENABLED) {
			Set sKeys = solicitudesXMLyCentros.keySet();
			Vector keys = new Vector (sKeys);
			
			if (!keys.iterator().hasNext()){
				System.out.println("\n\n+++ NO TENES NINGUN PEDIDO 'pendiente de distribucion' +++ /// EL HASH TABLE VIENE VACIO\n\n");
			}
			
			
			for (Iterator i = keys.iterator(); i.hasNext() ; ){
				String xml = (String) i.next();
				CentroDistribucion cd = solicitudesXMLyCentros.get(xml);
				if (cd.getEndpoint() != null && cd.getEndpoint() != "") {
					new Thread(new EnviarSolicitudDistribucionRunnable(xml, cd)).start();
					//soapAdmin.enviarSolDist(xml, cd);
				}
			}	
		}
	}
	
	
	@Override
	public void enviarNuevoArt(Articulo art,
			List<CentroDistribucion> centros) {
		//XMLParser
		String xml="";
		xml = art.getGeneratedXmlString();
        notificarMensajeNuevoArticulo(centros, xml);
	}

	private void notificarMensajeNuevoArticulo(
            List<CentroDistribucion> centros, String xml) {
    if (FABRICA_ENABLED) {
            new Thread(new EnviarMensajeFabricaRunnable(xml)).start();
//            JMSClient.enviarMensajeFabrica(xml);
    }
    if (CENTRO_DISTRIBUCION_ENABLED) { 
            for (CentroDistribucion centro : centros) {
                    if (centro.getJmsConnectionString() != null && centro.getQueueName() !=null) {
                            new Thread(new EnviarMensajeACentroDistribucionRunnable(xml, centro)).start();
//                            JMSClient.enviarMensajeCD(xml, centro);
                    }
            }
    	}
	}
	
    
    /**
     * Clase que nos permite enviar request de forma no bloqueante a la Fabrica
     * via JMS.
     * 
     */
    class EnviarMensajeFabricaRunnable implements Runnable {
            private String xml;
            public EnviarMensajeFabricaRunnable(String xml) {
                    this.xml = xml;
            }
            public void run() {
                    System.out.println("EnviarMensajeFabricaRunnable.run()");
                    JMSClient.enviarMensajeFabrica(this.xml);
            }
    }
    
    /**
     * Clase para enviar pedidos de forma no bloqueante a los centros de distribucio
     * via JMS. Caso Nuevo articulo
     */
    class EnviarMensajeACentroDistribucionRunnable implements Runnable {
            private String xml;
            private CentroDistribucion centro;
            
            public EnviarMensajeACentroDistribucionRunnable(String xml, CentroDistribucion centro) {
                    this.xml = xml;
                    this.centro = centro;
            }

            public void run() {
                    System.out.println("EnviarMensajeACentroDistribucionRunnable.run()");
                    JMSClient.enviarMensajeCD(xml, centro);
            }
    }
    
    /**
     *  Clase para enviar pedidos de forma no bloqueante a los centros de distribucio
     *  via Soap WS. Caso generar solicitud de distribucion
     */
    class EnviarSolicitudDistribucionRunnable implements Runnable {
            private String xml;
            private CentroDistribucion centro;
            
            public EnviarSolicitudDistribucionRunnable(String xml,
                            CentroDistribucion centro) {
                    super();
                    this.xml = xml;
                    this.centro = centro;
            }


            public void run() {
                    System.out.println("EnviarSolicitudDistribucionRunnable.run()");
                    soapAdmin.enviarSolDist(xml, centro);
            }
            
    }
    
    /**
     * Clase para enviar pedidos de forma no bloqueante a las tiendas
     * via JMS. Caso OFAD
     */
    class EnviarOfadATienda implements Runnable {

            private String xml;
            private Tienda tienda;
            
            public EnviarOfadATienda(String xml, Tienda tienda) {
                    super();
                    this.xml = xml;
                    this.tienda = tienda;
            }

            public void run() {
                    System.out.println("EnviarOfadATienda.run()");
                    JMSClient.enviarOfad(xml, tienda);
            }
    }

}
